home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / ms_dos / etos / etos.c next >
Encoding:
C/C++ Source or Header  |  1993-07-08  |  7.3 KB  |  260 lines

  1. /*--------------------------------------------------------------------*
  2.  *  etos.c = EUC --> SJIS                             Ver. 2.4  L. 00 *
  3.  *                                                                    *
  4.  *   MS-DOS (or UNIX)                                                 *
  5.  *                                                                    *
  6.  *   MS-C Ver. 6.00                                                   *
  7.  *                                                                    *
  8.  *   create      1989.03     KU666                                    *
  9.  *   modify      1993.02.19  KU666                                    *
  10.  *                                                                    *
  11.  *--------------------------------------------------------------------*/
  12. #include <stdio.h>
  13. #include <string.h>
  14. #include <process.h>
  15.  
  16. #define  MS_DOS       1
  17.  
  18. #if MS_DOS
  19. #include <io.h>
  20. #include <dos.h>
  21. #endif
  22.  
  23. #define  LINE_MAX     65535
  24. #define  BUFF_MAX       256
  25. #define  PATH_MAX        80
  26.  
  27. #if TC
  28. #define  EXDEV      ENOTSAM
  29. #endif
  30.  
  31. #define  OFF          0
  32. #define  ON           1
  33. #define  VER          "2.4"
  34.  
  35. unsigned char  buff1[BUFF_MAX], buff2[BUFF_MAX];
  36. char           com1[PATH_MAX], temp[PATH_MAX];
  37. int            file_cnt;
  38. int            not_code,                /*                   */
  39.                not_kana,                /* EUC     漢字コード外 */
  40.                opt_flg,                 /*                   */
  41.                owrt_flg,                /* over write flag   */
  42.                name_flg;                /*                   */
  43. FILE           *fp1, *fp2;
  44.  
  45. void err_msg1(void);
  46. void para_chk(char *[]);
  47. void file_open(char *[]);
  48. void kana_cnv(int *, int *);
  49. void kanji_cnv(int *, int *);
  50. void file_mv(char *, char *);
  51. void err_msg2(char *[]);
  52.  
  53. main (int argc, char *argv[])
  54. {
  55.     unsigned   i;
  56.     static int j, k;
  57.  
  58.     strcpy(temp, "wk_____");
  59.  
  60.     if (argc == 1) {
  61.         err_msg1();
  62.     }
  63.     para_chk(argv);
  64.  
  65.     for (file_cnt = 1+opt_flg; file_cnt < argc; file_cnt++) {
  66.  
  67.         file_open(argv);
  68.  
  69.         for (i = 0; i < LINE_MAX; i++) {
  70.             if (NULL == fgets (buff1, BUFF_MAX, fp1)) {
  71.                 break;
  72.             }
  73.             for (j = 0, k = 0; j < BUFF_MAX; j++, k++) {
  74.                 buff2[k] = buff1[j];
  75.                 if (buff1[j] == (unsigned char)NULL) {
  76.                     break;
  77.                 }
  78.                 if (buff1[j] == 0x8e) { /* かな */
  79.                     kana_cnv(&j, &k);
  80.                 } else {                /* 漢字 */
  81.                     kanji_cnv(&j, &k);
  82.                 }
  83.             }
  84.             fputs(buff2, fp2);          /* write file      */
  85.         }
  86.  
  87.         fclose(fp1);
  88.         if (opt_flg == ON) {
  89.             fclose(fp2);
  90.         }
  91.  
  92.         if (owrt_flg == 1) {            /* file delete     */
  93.             printf("file name = %s\n", argv[file_cnt]);
  94.             file_mv(temp, argv[file_cnt]); /* file mv      */
  95.         }
  96.         err_msg2(argv);                 /* error messge    */
  97.     }
  98.     return (0);
  99. }
  100.  
  101. void para_chk(char *argv[])
  102. {
  103.     opt_flg = owrt_flg = name_flg = OFF;
  104.  
  105.     if (argv[1][0] == '-') {
  106.         opt_flg = ON;
  107.         if (argv[1][1] == 'd') {
  108.             owrt_flg = ON;
  109.         } else if (argv[1][1] == 'D') {
  110.             name_flg = ON;
  111.         } else {
  112.             err_msg1();
  113.         }
  114.     }
  115. }
  116.  
  117. void file_open(char *argv[])
  118. {
  119.     int  i;
  120.     char fname[64];
  121.  
  122.     if (NULL == (fp1 = fopen(argv[file_cnt], "r"))) {
  123.         printf("\n Cannot Open File(1) : %s\n\n", argv[file_cnt]);
  124.         exit(1);
  125.     }
  126.     if (owrt_flg == ON) {               /* -d オプション */
  127.         if (NULL == (fp2 = fopen (temp, "w"))) {
  128.             printf("\n Cannot Open File(2) : %s(%s)\n\n", temp, argv[file_cnt]);
  129.             exit(1);
  130.         }
  131.     } else {
  132.         strcpy(fname, argv[file_cnt+1]);
  133.         if (name_flg == ON) {           /* -D オプション */
  134.             strcpy(fname, argv[file_cnt]);
  135.             for (i = 0; ; i++) {
  136.                if (fname[i] == '.') {
  137.                    strncpy(&fname[i+1], "sji", 4);
  138.                    break;
  139.                } else if (fname[i] == (char)NULL) {
  140.                    strncpy(&fname[i], ".sji", 5);
  141.                    break;
  142.                }
  143.             }
  144.             printf("output file name = %s\n",fname);
  145.             if (NULL == (fp2 = fopen (fname, "w"))) {
  146.                 printf("\n Cannot Open File(3) : %s\n\n", fname);
  147.                 exit(1);
  148.             }
  149.         } else {
  150.             fp2 = stdout;
  151.         }
  152.     }
  153. }
  154.  
  155. void kana_cnv(int *cnt1, int *cnt2)
  156. {
  157.     if (buff1[(*cnt1)+1] >= 0xa0 && buff1[(*cnt1)+1] <= 0xff) {
  158.         if (buff1[(*cnt1)+1] >= 0xf0 && buff1[(*cnt1)+1] <= 0xff) {
  159.             buff2[(*cnt2)+1] = buff1[(*cnt1)+1];
  160.             (*cnt1)++, (*cnt2)++;
  161.             not_code++;
  162.         } else {
  163.             buff2[*cnt2] = buff1[(*cnt1)+1];
  164.             (*cnt1)++;
  165.         }
  166.     } else {
  167.         not_kana++;
  168.     }
  169. }
  170.  
  171. void kanji_cnv(int *cnt1, int *cnt2)
  172. {
  173.     unsigned char  tmp, add_a, add_b;
  174.  
  175.     if (buff1[(*cnt1)] >= 0xa1) {       /* 漢字コード      */
  176.         add_a = 0, add_b = 0;
  177.         tmp   = buff1[(*cnt1)]   - (char)0xa0;
  178.         add_b = buff1[(*cnt1)+1] - (char)0xa1;
  179.         add_a = (char)((tmp/2)-1);
  180.         if (tmp % 2 == 1) {
  181.             buff2[(*cnt2)+1] = (char)(0x40 + add_b);
  182.             add_a = add_a+(char)1;
  183.         } else {
  184.             buff2[(*cnt2)+1] = (char)0x9f + add_b;
  185.         }
  186.         if (buff2[(*cnt2)+1] >= 0x7f && buff2[(*cnt2)+1] <= 0x9e) {
  187.             buff2[(*cnt2)+1] = buff2[(*cnt2)+1]+(char)1;
  188.         }
  189.         buff2[(*cnt2)]   = (char)0x81 + add_a;
  190.         (*cnt2)++, (*cnt1)++;
  191.     }
  192. }
  193.  
  194. #if MS_DOS
  195. void file_mv(char *old, char *new)      /* MS-DOS */
  196. {
  197.     int  ret;
  198.  
  199.     ret = remove(new);
  200.     if (ret != 0) {
  201.         printf("remove エラー = %d\n", ret);
  202.     }
  203.     ret = rename(old, new);
  204.     if (ret != 0) {
  205.         printf("rename エラー = %d\n", ret);
  206.     }
  207. }
  208. #endif
  209.  
  210. #if UNIX
  211. void file_mv(char *old, char *new)      /* UNIX */
  212. {
  213.     unsigned int   i;
  214.     int            j;
  215.  
  216.     if (NULL == (fp1 = fopen (old, "r"))) {
  217.         exit(1);
  218.     }
  219.     if (NULL == (fp2 = fopen (new, "w"))) {
  220.         exit(1);
  221.     }
  222.     for (i = 0; i < LINE_MAX; i++) {
  223.         if (NULL == fgets (buff1, BUFF_MAX, fp1)) {
  224.             break;
  225.         }
  226.         for (j = 0; j < BUFF_MAX; j++) {
  227.             buff2[j] = buff1[j];
  228.          }
  229.         fputs(buff2, fp2);
  230.     }
  231.     fclose(fp1);
  232.     fclose(fp2);
  233.     sprintf(com1, "rm %s", old);
  234.     system(com1);                       /* file delete     */
  235. }
  236. #endif
  237.  
  238. void err_msg1(void)
  239. {
  240.     printf("etos (Ver. %s)\n" , VER);
  241.     printf("Usage: etos [-d|-D] <filename>...\n");
  242.     printf("\nEx.)\n");
  243.     printf(" etos <filename>...\n");
  244.     printf(" etos -d filename      (Over Wriete)\n");
  245.     printf(" etos -D filename      (xxxxxxxx.sji)\n");
  246.     exit(1);
  247. }
  248.  
  249. void err_msg2(char *argv[])             /* error messge */
  250. {
  251.     if (not_code != 0) {
  252.         printf("\n%s : count of unconvertable code(s) = %d\n",
  253.                  argv[file_cnt], not_code);
  254.     }
  255.     if (not_kana != 0) {
  256.         printf("\n%s : count of bad KANA code pair(s) = %d\n",
  257.                  argv[file_cnt], not_kana);
  258.     }
  259. }
  260.